在一次工作中身边的一位资深的同事突然问了个a=a+b与a+=b有什么区别此时有点尴尬了不知道是真的不知道咧还是别有用意....今天抽点时间针对此问题做个小总结
一、性能方面
a=a+b是加法运算需要两次寻找地址而a+=b是增量运算有寄存器优先时只有一次地址查找。效率方面后者略高于前者基于现在计算机的发展可忽略不计。
二、可读性方面
两者都是赋值运算,一般情况下可以认为两者没有什么区别但前者与数学算法描述更接近相对来说更严谨而后者书写更快捷但可读性下降。
三、数据类型方面
两者写法上主要在于是否能进行数据类型自动转换,事实上就是类型与精度上的差异。eg:当两个操作数数据类型一致时两种形式的运算结果没有差别但数据类型不同时且a值的数据类型精度低时此时两种形式就有区别了。
定义a是short类型变量执行a+=b[b为int类型的20值]时输出结果为30 自动将int为20的类型转换int。
代码稍微调整一下
调整为a=a+b结构时编译无法通过类型不匹配。而在javascript中确不存在此问题弱类型语言真强大啊……
为什么在C#中会有此问题产生呢?
原因:在"+="这个运算符在C#中是一个运算符程序在执行“+=”时会自动向高精度类型转换即a+=20 编译通过;而“=”要求两过类型一致 a=a+b结构中 a是short类型变量而b为int类型常量此时(short类型+int类型)出现类型不匹配问题估编译失败。
注:b为变量且明确申名了变量数据类型时则a+=b与a=a+b 都存在类型转换问题需强制进行类型转换
若强行用short类型去接收int类型的数据可以进行强类型转换但最终导致结果是精度丢失。
others
区别在于a+=b,a只会被evaluate一次,而a = a + b,a会被evaluate两次
现在的编译器基本上都会优化成一样的
对于返回类类型对象的+,a = a + b 比 a += b多构造一个对象是对的。
但是当类的复制构造函数没有除了复制成员外的副作用时,这里的性能差别可以忽略。当然debug下能看得出来,但要是release还不优化就说明编译器太弱了。
iso c++11 5.17/7
The behavior of an expression of the form E1 op = E2 is equivalent to E1 = E1 op E2 except that E1 is evaluated only once.
本页共22段,1200个字符,2596 Byte(字节)